package cn.wuyu.baselibrary.base;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.DownloadListener;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;

import com.google.gson.Gson;
import com.just.agentweb.AbsAgentWebSettings;
import com.just.agentweb.AgentWeb;
import com.just.agentweb.DefaultWebClient;
import com.just.agentweb.IAgentWebSettings;
import com.just.agentweb.PermissionInterceptor;

import java.util.HashMap;

import androidx.appcompat.app.AlertDialog;
import cn.wuyu.baselibrary.R;
import cn.wuyu.baselibrary.common.CommonWebChromeClient;
import cn.wuyu.baselibrary.utils.NetworkUtils;

/**
 * author : xuzongmeng
 * date   : 2019/4/2.
 * desc   : 描述
 * http://test.wuyuqizhu.com/webapp/#/
 */
public class WebViewFragment extends BaseFragment {
    private static final String URL = "BaseFragmentWebView";
    private String mParam1;
    private Context mContext;
    private AgentWeb mWebview;
//    WebView mWebview;

    public WebView getWebview() {
        return mWebview.getWebCreator().getWebView();
    }

    /**
     * @param param1 要加载页面的URL
     */
    public static WebViewFragment newInstance(String param1) {
        WebViewFragment fragment = new WebViewFragment();
        Bundle args = new Bundle();
        args.putString(URL, param1);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(URL);
            if (TextUtils.isEmpty(mParam1)) {
                showEmpty();
            }
        }
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void initViews(View view) {
        LinearLayout container = view.findViewById(R.id.container);
//        WebSettings webSettings = mWebview.getSettings();
//        webSettings.setJavaScriptEnabled(true);
//        mWebview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
//        webSettings.setDefaultTextEncodingName("UTF-8");
//        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
//        webSettings.setBuiltInZoomControls(false);
//        webSettings.setSupportMultipleWindows(true);
//        webSettings.setUseWideViewPort(true);
//        webSettings.setLoadWithOverviewMode(true);
//        webSettings.setSupportZoom(false);
////		webSettings.setPluginState(WebSettings.PluginState.ON);
//        webSettings.setDomStorageEnabled(true);
//        webSettings.setUserAgentString(webSettings.getUserAgentString() + " douwen/" + AppUtils.getAppVersionName());
//        mWebview.setWebViewClient(new MyBridgeWebViewClient());
//        mWebview.setWebChromeClient(new MyWebChromeClient());
//        mWebview.setDownloadListener(new MyWebViewDownLoadListener());
//        mWebview.loadUrl(mParam1);



              mWebview = AgentWeb.with(this)//
                .setAgentWebParent(container, -1, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))//传入AgentWeb的父控件。
                .useDefaultIndicator(-1, 3)//设置进度条颜色与高度，-1为默认值，高度为2，单位为dp。
                .setAgentWebWebSettings(getSettings())//设置 IAgentWebSettings。
                .setWebViewClient(mWebViewClient)//WebViewClient ， 与 WebView 使用一致 ，但是请勿获取WebView调用setWebViewClient(xx)方法了,会覆盖AgentWeb DefaultWebClient,同时相应的中间件也会失效。
                .setWebChromeClient(new CommonWebChromeClient()) //WebChromeClient
                .setPermissionInterceptor(new PermissionInterceptor() {
                    @Override
                    public boolean intercept(String url, String[] permissions, String action) {
                        return false;
                    }
                }) //权限拦截 2.0.0 加入。
                .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK) //严格模式 Android 4.2.2 以下会放弃注入对象 ，使用AgentWebView没影响。
//                .setAgentWebUIController(new UIController(getActivity())) //自定义UI  AgentWeb3.0.0 加入。
                .setMainFrameErrorView(R.layout.agentweb_error_page, -1) //参数1是错误显示的布局，参数2点击刷新控件ID -1表示点击整个布局都刷新， AgentWeb 3.0.0 加入。
//                .useMiddlewareWebChrome(getMiddlewareWebChrome()) //设置WebChromeClient中间件，支持多个WebChromeClient，AgentWeb 3.0.0 加入。
//                .useMiddlewareWebClient(getMiddlewareWebClient()) //设置WebViewClient中间件，支持多个WebViewClient， AgentWeb 3.0.0 加入。
//                .setDownloadListener(mDownloadListener) 4.0.0 删除该API//下载回调
//                .openParallelDownload()// 4.0.0删除该API 打开并行下载 , 默认串行下载。 请通过AgentWebDownloader#Extra实现并行下载
//                .setNotifyIcon(R.drawable.ic_file_download_black_24dp) 4.0.0删除该api //下载通知图标。4.0.0后的版本请通过AgentWebDownloader#Extra修改icon
                .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.DISALLOW)//打开其他页面时，弹窗质询用户前往其他应用 AgentWeb 3.0.0 加入。
                .interceptUnkownUrl() //拦截找不到相关页面的Url AgentWeb 3.0.0 加入。
                .createAgentWeb()//创建AgentWeb。
                .ready()//设置 WebSettings。
                .go(mParam1); //WebView载入该url地址的页面并显示。
    }

    /**
     * @return IAgentWebSettings
     */
    public IAgentWebSettings getSettings() {
        return new AbsAgentWebSettings() {
            private AgentWeb mAgentWeb;

            @Override
            protected void bindAgentWebSupport(AgentWeb agentWeb) {
                this.mAgentWeb = agentWeb;
            }

            /**
             * AgentWeb 4.0.0 内部删除了 DownloadListener 监听 ，以及相关API ，将 Download 部分完全抽离出来独立一个库，
             * 如果你需要使用 AgentWeb Download 部分 ， 请依赖上 compile 'com.just.agentweb:download:4.0.0 ，
             * 如果你需要监听下载结果，请自定义 AgentWebSetting ， New 出 DefaultDownloadImpl，传入DownloadListenerAdapter
             * 实现进度或者结果监听，例如下面这个例子，如果你不需要监听进度，或者下载结果，下面 setDownloader 的例子可以忽略。
             * @param webView
             * @param downloadListener
             * @return WebListenerManager
             */
//            @Override
//            public WebListenerManager setDownloader(WebView webView, android.webkit.DownloadListener downloadListener) {
//                return super.setDownloader(webView,
//                        DefaultDownloadImpl.create((Activity) webView.getContext(),
//                                webView, mSimpleDownloadListener,
//                                this.mAgentWeb.getPermissionInterceptor()));
//            }

        };
    }

    @Override
    public void onReLoadData() {
        mWebview.getWebCreator().getWebView().reload();
    }

    @Override
    public int getLayoutID() {
        return R.layout.fragment_webview;
    }

    @Override
    protected void initView(View view) {
        mContext = getActivity();
//        mWebview = view.findViewById(R.id.webView);
        initViews(view);
    }

//    /**
//     * 重写webChromeClient
//     */
//    private class MyWebChromeClient extends WebChromeClient {
//        @SuppressWarnings("unused")
//        public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType, String capture) {
//            this.openFileChooser(uploadMsg);
//        }
//
//        @SuppressWarnings("unused")
//        public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType) {
//            this.openFileChooser(uploadMsg);
//        }
//
//        public void openFileChooser(ValueCallback<Uri> uploadMsg) {
//            pickFile();
//        }
//
//        @Override
//        public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
//            new AlertDialog.Builder(mContext)
//                    .setMessage(message)
//                    .setPositiveButton(R.string.dialog_btn_confirm_text, (dialog, which) -> result.confirm())
//                    .show();
//            return true;
//        }
//
//        @Override
//        public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
//            new AlertDialog.Builder(mContext)
//                    .setMessage(message)
//                    .setPositiveButton(R.string.dialog_btn_confirm_text, (dialog, which) -> result.confirm())
//                    .setNegativeButton(R.string.dialog_btn_cancel_text, (dialog, which) -> result.cancel())
//                    .show();
//            return true;
//        }
//
//        @Override
//        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
//            new AlertDialog.Builder(mContext)
//                    .setMessage(message)
//                    .setPositiveButton(R.string.dialog_btn_confirm_text, (dialog, which) -> result.confirm())
//                    .setNegativeButton(R.string.dialog_btn_cancel_text, (dialog, which) -> result.cancel())
//                    .show();
//            return true;
//        }
//    }


    protected WebViewClient mWebViewClient = new WebViewClient() {

        private HashMap<String, Long> timer = new HashMap<>();

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            return shouldOverrideUrlLoading(view, request.getUrl() + "");
        }


        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            return super.shouldInterceptRequest(view, request);
        }

        //
        @Override
        public boolean shouldOverrideUrlLoading(final WebView view, String url) {

            Log.i(TAG, "view:" + new Gson().toJson(view.getHitTestResult()));
            Log.i(TAG, "mWebViewClient shouldOverrideUrlLoading:" + url);
            //intent:// scheme的处理 如果返回false ， 则交给 DefaultWebClient 处理 ， 默认会打开该Activity  ， 如果Activity不存在则跳到应用市场上去.  true 表示拦截
            //例如优酷视频播放 ，intent://play?...package=com.youku.phone;end;
            //优酷想唤起自己应用播放该视频 ， 下面拦截地址返回 true  则会在应用内 H5 播放 ，禁止优酷唤起播放该视频， 如果返回 false ， DefaultWebClient  会根据intent 协议处理 该地址 ， 首先匹配该应用存不存在 ，如果存在 ， 唤起该应用播放 ， 如果不存在 ， 则跳到应用市场下载该应用 .
            if (url.startsWith("intent://") && url.contains("com.youku.phone")) {
                return true;
            }
			/*else if (isAlipay(view, mUrl))   //1.2.5开始不用调用该方法了 ，只要引入支付宝sdk即可 ， DefaultWebClient 默认会处理相应url调起支付宝
			    return true;*/


            return false;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.i(TAG, "mUrl:" + url + " onPageStarted  target:" + url);
            timer.put(url, System.currentTimeMillis());
//            if (url.equals(getUrl())) {
//                pageNavigator(View.GONE);
//            } else {
//                pageNavigator(View.VISIBLE);
//            }

        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            if (timer.get(url) != null) {
                long overTime = System.currentTimeMillis();
                Long startTime = timer.get(url);
                Log.i(TAG, "  page mUrl:" + url + "  used time:" + (overTime - startTime));
            }

        }
        /*错误页回调该方法 ， 如果重写了该方法， 上面传入了布局将不会显示 ， 交由开发者实现，注意参数对齐。*/
	   /* public void onMainFrameError(AbsAgentWebUIController agentWebUIController, WebView view, int errorCode, String description, String failingUrl) {

            Log.i(TAG, "AgentWebFragment onMainFrameError");
            agentWebUIController.onMainFrameError(view,errorCode,description,failingUrl);

        }*/

        @Override
        public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
            super.onReceivedHttpError(view, request, errorResponse);

//			Log.i(TAG, "onReceivedHttpError:" + 3 + "  request:" + mGson.toJson(request) + "  errorResponse:" + mGson.toJson(errorResponse));
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);

//			Log.i(TAG, "onReceivedError:" + errorCode + "  description:" + description + "  errorResponse:" + failingUrl);
        }
    };


//
//    /**
//     * 重写WebViewClient
//     */
//    private class MyBridgeWebViewClient extends WebViewClient {
//
//        @Override
//        public boolean shouldOverrideUrlLoading(WebView view, String url) {
//	/*		KLog.d("webView=" + url);
//			try {
//				url = URLDecoder.decode(url, "UTF-8");
//			} catch (UnsupportedEncodingException e) {
//				e.printStackTrace();
//			}
//
//			if (url.startsWith("yy://return/")) { // 如果是返回数据
//				mWebview.handlerReturnData(url);
//				return true;
//			} else if (url.startsWith("yy://")) { //
//				mWebview.flushMessageQueue();
//				return true;
//			} else {
//				return super.shouldOverrideUrlLoading(view, url);
//			}*/
//            return super.shouldOverrideUrlLoading(view, url);
//        }
//
//        @Override
//        public void onPageStarted(WebView view, String url, Bitmap favicon) {
//            showLoading();
//            super.onPageStarted(view, url, favicon);
//        }
//
//        @Override
//        public void onPageFinished(WebView view, String url) {
//            super.onPageFinished(view, url);
//            showContent();
//
//        }
//
//        @Override
//        public void onReceivedError(WebView view, WebResourceRequest resourceRequest, WebResourceError error) {
//            showNoNetwork();
//            super.onReceivedError(view, resourceRequest, error);
//        }
//    }

    /**
     * 重写DownLoadListener
     */
    private class MyWebViewDownLoadListener implements DownloadListener {
        @Override
        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,
                                    long contentLength) {
            Uri uri = Uri.parse(url);
            final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            if (!NetworkUtils.isWifiConnected()) {
                new AlertDialog.Builder(mContext)
                        .setMessage(R.string.dialog_no_available_wifi)
                        .setNegativeButton(R.string.dialog_btn_cancel_text, (dialog, which) -> {
                        })
                        .setPositiveButton(R.string.dialog_btn_confirm_text, (dialog, which) -> startActivity(intent))
                        .show();
            } else {
                startActivity(intent);
            }
        }
    }

    int RESULT_CODE = 0;

    /**
     * 打开文件
     */
    public void pickFile() {
        Intent chooserIntent = new Intent(Intent.ACTION_GET_CONTENT);
        chooserIntent.setType("image/*");
        startActivityForResult(chooserIntent, RESULT_CODE);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mWebview != null) {
            mWebview.destroy();
        }
    }
}
